motordir.bits.motor42=0; } CCAP4L=speed; CCAP4H=speed; break; default: break; } MotorOutPort=motordir.all; }
void stopmotor() //停止电机运转 { MotorOutPort=0x00; }
4.4 液晶显示驱动程序设计
液晶显示函数比较复杂,在使用的时候要注意延时函数的搭配,具体实现如下:
#define Uchar unsigned char #define Uint unsigned int #define DATA_PORT P0
sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2;
sbit P1_5 = P1^5;
sbit BLK = P1^6; //P16:LCD1602液晶背光控制引脚
void lcd_busy(); //液晶忙检测函数
void lcd_wcmd(unsigned char cmd, bit Check);//写液晶命令函数 void lcd_wdat(unsigned char dat);//写数据函数 void lcd_init();//液晶初始化
void lcd_pos(unsigned char xpos, unsigned char ypos);//液晶显示定位 void wr_string(unsigned char str[]);//写字符函数 void delayNOP() {
_nop_(); _nop_(); _nop_(); _nop_(); }
/**********************************************************
ms延时子程序
**********************************************************/ void delayms(unsigned int ms) {
unsigned char k; while (ms--) {
for (k = 0; k < 114; k++) ; } }
/********************************************************** 检查LCD忙状态
lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
**********************************************************/ void lcd_busy() {
bit busy; busy = 1; while (busy) {
LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;
busy = (bit)(DATA_PORT &0x80); delayNOP(); }
LCD_EN = 0; }
/********************************************************** 写指令数据到LCD
RS=L,RW=L,EN 下降沿执行写操作。D0-D7=指令码。 Check=1,进行忙检测。
**********************************************************/ void lcd_wcmd(unsigned char cmd, bit Check) {
if (Check)
lcd_busy(); //进行忙检测
LCD_RS = 0; LCD_RW = 0;
LCD_EN = 1;
DATA_PORT = cmd; delayNOP(); LCD_EN = 0; }
/********************************************************** 写显示数据到LCD
RS=H,RW=L,EN 下降沿执行写操作。D0-D7=数据。
**********************************************************/ void lcd_wdat(unsigned char dat) {
lcd_busy(); //进行忙检测 LCD_RS = 1; LCD_RW = 0; LCD_EN = 1;
DATA_PORT = dat; delayNOP(); LCD_EN = 0; }
/********************************************************** LCD初始化设定
**********************************************************/ void lcd_init() {
delayms(15);
lcd_wcmd(0x38, 0); //16*2显示,5*7点阵,8位数据 delayms(5);
lcd_wcmd(0x38, 0); //不进行忙检测,强制执行三次。 delayms(5);
lcd_wcmd(0x38, 0); delayms(5);
lcd_wcmd(0x38, 1); //进行忙检测 delayms(5);
lcd_wcmd(0x0c, 1); //显示开,关光标 delayms(5);
lcd_wcmd(0x06, 1); //移动光标 delayms(5);
lcd_wcmd(0x01, 1); //清除LCD的显示内容 delayms(5); }
/********************************************************** 设定显示位置
**********************************************************/ void lcd_pos(unsigned char xpos, unsigned char ypos) {
if (ypos == 0x01)
lcd_wcmd((xpos | 0x80), 1); if (ypos == 0x02)
lcd_wcmd((xpos | 0xc0), 1); }
/********************************************************** 写字符串子函数
**********************************************************/ void wr_string(unsigned char str[]) {
unsigned char num = 0;
while (str[num]) {
lcd_wdat(str[num++]); delayms(150); } }
4.5 数字量控制驱动程序设计
输入函数如下: #include \
Uchar pdata DigInPort _at_ 0x5f; //分配输入端口地址
/***************************************************** 功能:digin
描述:数字量输入函数 参数:通道号 返回:数字量
*****************************************************/
Uchar digin(Uchar chanel) { Uchar diginval; Uchar i; diginval=DigInPort; for(i=0;i diginval>>=1; } diginval&=0x01; return diginval; } /***************************************************** 功能:diginal 描述:数字量输入函数 参数:无 返回:所有输入通道值 *****************************************************/ Uchar diginall(void) { Uchar val; val=DigInPort; return val; } 数字量输出控制函数如下: //***************************************************************************** #include \ #include \#include \ Uchar pdata DigOutPort _at_ 0x3f; //分配输出地址 /***************************************************** 功能:digout 描述:数字量输出函数 参数:通道号,输出值 返回:无 *****************************************************/ void digout(Uchar chanel,Uchar val) { static union DIGOUT_REG data digoutval={0xff}; switch (chanel) { case 0: digoutval.bits.digout0=val; break; 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库多功能数据采集控制板的设计与实现 - 图文(6)在线全文阅读。
相关推荐: