網上搜集到的一個關于編碼器與單片機的資料
單片機源程序如下:
- #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)
2018-11-13 12:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|