网上搜集到的一个关于编码器与单片机的资料
单片机源程序如下:
- #include<reg51.h>
- #include <MATH.H>
- /**********************************
- 宏定义字符串
- **********************************/
- #define uchar unsigned char
- #define LCD_DAT P0 //LCD数据/指令输入端(D7,D6,D5,D4,D3,D2,D1,D0)
- sbit LCD_RW = P2^5;//LCD读写控制端
- sbit LCD_RS = P2^6;//LCD指令/数据控制端
- sbit LCD_E = P2^7; //LCD使能控制端
- sbit AA = P1^0;//接编码器A端
- sbit BB = P1^1;//接编码器B端
- /**********************************
- 任意ms延时函数
- **********************************/
- void delayms(uchar count)
- {
- uchar i,j;
- for(i = 0; i < count; i++)
- for(j = 0; j < 120; j++);
- }
- /**********************************
- 5ms延时函数
- **********************************/
- void delay(void) //延时5ms
- {
- uchar a, b;
- for(b = 19; b > 0; b--)
- for(a = 130; a > 0; a--);
- }
- /**********************************
- LCD写函数
- **********************************/
- void LCD_W(uchar m, uchar com_dat) //m=0:写指令,m=1:写数据
- {
- LCD_RS = m;
- LCD_RW = 0;//写操作
- LCD_E = 0; //使能禁止
- LCD_DAT = com_dat; //在指令/数据端置数
- delay(); //5ms延时
- LCD_E = 1; //使能允许
- delay(); //5ms延时
- LCD_E = 0; //使能禁止
- }
- /**********************************
- LCD初始化函数
- **********************************/
- void LCD_INIT()
- {
- delay();
- delay();
- delay(); //5ms延时
- LCD_W(0, 0x38); //不检测忙信号
- delay();
- LCD_W(0, 0x38); //不检测忙信号
- delay();
- LCD_W(0, 0x38); //不检测忙信号
- LCD_W(0, 0x38); //显示模式
- LCD_W(0, 0x08); //显示关闭
- LCD_W(0, 0x06); //光标移动
- LCD_W(0, 0x0c); //显示开和光标设置
- }
- /**********************************
- LCD清屏函数
- **********************************/
- void CLS()
- {
- LCD_W(0, 0x01); //清屏
- }
- /**********************************
- LCD定位函数
- **********************************/
- void LOCATE(uchar H, uchar L)
- {
- if(H == 1) //如果是第一行
- LCD_W(0, 0x80 + L - 1); //定位在第一行第L列
- else
- LCD_W(0, 0x80 + 0x40 + L - 1); //否则定位在第二行第L列
- }
- /**********************************
- LCD显示数值函数
- **********************************/
- void LCD(unsigned long num)
- {
- char n, m;
- unsigned long ww;
- if(num > 9) //两位数以上进行处理显示
- {
- n = log10(num); //取数值的位数
- for(m = n; m >= 0; m--) //从高位开始输出
- {
- ww = (num / pow(10, m)); //从高位向低位依次取数
- ww = ww % 10; //取各次的最低位数
- LCD_W(1, 48 + ww); //输出
- }
- }
- else LCD_W(1, 48 + num); //一位数直接显示
- LCD_W(1, ' '); //显示空格
- LCD_W(1, ' '); //显示空格
- LCD_W(1, ' '); //显示空格
- }
- /**********************************
- 主函数
- **********************************/
- void main()
- {
- uchar kkk, keys, tmp = 1;
- LCD_INIT();//LCD初始化
- CLS();//清屏
- while(1)
- {
- if(AA == 0)//开始检测是否旋转了开关
- {
- delayms(10);//消除抖动
- if(AA == 0) //确实是旋转了,进行正反转判断
- {
- if(BB == 0)//正转,进行正转处理
- {
- tmp = tmp * 2;//为了使LED正向递增
- if(tmp == 0)tmp = 128;//达到最大值,不再加
- kkk = '+';//正转显示 +
- }
- if(BB == 1)//反转,进行反转处理
- {
- tmp = tmp / 2;//为了使LED反向递减
- if(tmp == 0)tmp = 1;//达到最小值,不再减
- kkk = '-';//反转显示 -
- }
- }
- LOCATE(1,1);//定位第 1 行 1 列
- LCD(tmp);//显示数值
- LOCATE(1,5);//定位第 1 行 5 列
- LCD_W(1, kkk);//显示字符
- keys = 0;//延时等待计数器
- while(AA == 0)//等待开关A端复位(断开),防止出现乱加减的现象
- {
- delayms(20);//延时等待
- keys++;//计数器加 1
- if(keys == 50)break;//达到 1 秒没有复位,开关卡住了,退出继续扫描开关
- }
- }
- P3 = ~tmp; //输出到P0
- }
- }
复制代码
所有资料51hei提供下载:
一个旋转编码器 LCD1602的驱动程序.doc
(29.5 KB, 下载次数: 77)
|