網(wǎng)上搜集到的一個(gè)關(guān)于編碼器與單片機(jī)的資料
單片機(jī)源程序如下:
- #include<reg51.h>
- #include <MATH.H>
- /**********************************
- 宏定義字符串
- **********************************/
- #define uchar unsigned char
- #define LCD_DAT P0 //LCD數(shù)據(jù)/指令輸入端(D7,D6,D5,D4,D3,D2,D1,D0)
- sbit LCD_RW = P2^5;//LCD讀寫控制端
- sbit LCD_RS = P2^6;//LCD指令/數(shù)據(jù)控制端
- sbit LCD_E = P2^7; //LCD使能控制端
- sbit AA = P1^0;//接編碼器A端
- sbit BB = P1^1;//接編碼器B端
- /**********************************
- 任意ms延時(shí)函數(shù)
- **********************************/
- void delayms(uchar count)
- {
- uchar i,j;
- for(i = 0; i < count; i++)
- for(j = 0; j < 120; j++);
- }
- /**********************************
- 5ms延時(shí)函數(shù)
- **********************************/
- void delay(void) //延時(shí)5ms
- {
- uchar a, b;
- for(b = 19; b > 0; b--)
- for(a = 130; a > 0; a--);
- }
- /**********************************
- LCD寫函數(shù)
- **********************************/
- void LCD_W(uchar m, uchar com_dat) //m=0:寫指令,m=1:寫數(shù)據(jù)
- {
- LCD_RS = m;
- LCD_RW = 0;//寫操作
- LCD_E = 0; //使能禁止
- LCD_DAT = com_dat; //在指令/數(shù)據(jù)端置數(shù)
- delay(); //5ms延時(shí)
- LCD_E = 1; //使能允許
- delay(); //5ms延時(shí)
- LCD_E = 0; //使能禁止
- }
- /**********************************
- LCD初始化函數(shù)
- **********************************/
- void LCD_INIT()
- {
- delay();
- delay();
- delay(); //5ms延時(shí)
- LCD_W(0, 0x38); //不檢測忙信號(hào)
- delay();
- LCD_W(0, 0x38); //不檢測忙信號(hào)
- delay();
- LCD_W(0, 0x38); //不檢測忙信號(hào)
- LCD_W(0, 0x38); //顯示模式
- LCD_W(0, 0x08); //顯示關(guān)閉
- LCD_W(0, 0x06); //光標(biāo)移動(dòng)
- LCD_W(0, 0x0c); //顯示開和光標(biāo)設(shè)置
- }
- /**********************************
- LCD清屏函數(shù)
- **********************************/
- void CLS()
- {
- LCD_W(0, 0x01); //清屏
- }
- /**********************************
- LCD定位函數(shù)
- **********************************/
- 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顯示數(shù)值函數(shù)
- **********************************/
- void LCD(unsigned long num)
- {
- char n, m;
- unsigned long ww;
- if(num > 9) //兩位數(shù)以上進(jìn)行處理顯示
- {
- n = log10(num); //取數(shù)值的位數(shù)
- for(m = n; m >= 0; m--) //從高位開始輸出
- {
- ww = (num / pow(10, m)); //從高位向低位依次取數(shù)
- ww = ww % 10; //取各次的最低位數(shù)
- LCD_W(1, 48 + ww); //輸出
- }
- }
- else LCD_W(1, 48 + num); //一位數(shù)直接顯示
- LCD_W(1, ' '); //顯示空格
- LCD_W(1, ' '); //顯示空格
- LCD_W(1, ' '); //顯示空格
- }
- /**********************************
- 主函數(shù)
- **********************************/
- void main()
- {
- uchar kkk, keys, tmp = 1;
- LCD_INIT();//LCD初始化
- CLS();//清屏
- while(1)
- {
- if(AA == 0)//開始檢測是否旋轉(zhuǎn)了開關(guān)
- {
- delayms(10);//消除抖動(dòng)
- if(AA == 0) //確實(shí)是旋轉(zhuǎn)了,進(jìn)行正反轉(zhuǎn)判斷
- {
- if(BB == 0)//正轉(zhuǎn),進(jìn)行正轉(zhuǎn)處理
- {
- tmp = tmp * 2;//為了使LED正向遞增
- if(tmp == 0)tmp = 128;//達(dá)到最大值,不再加
- kkk = '+';//正轉(zhuǎn)顯示 +
- }
- if(BB == 1)//反轉(zhuǎn),進(jìn)行反轉(zhuǎn)處理
- {
- tmp = tmp / 2;//為了使LED反向遞減
- if(tmp == 0)tmp = 1;//達(dá)到最小值,不再減
- kkk = '-';//反轉(zhuǎn)顯示 -
- }
- }
- LOCATE(1,1);//定位第 1 行 1 列
- LCD(tmp);//顯示數(shù)值
- LOCATE(1,5);//定位第 1 行 5 列
- LCD_W(1, kkk);//顯示字符
- keys = 0;//延時(shí)等待計(jì)數(shù)器
- while(AA == 0)//等待開關(guān)A端復(fù)位(斷開),防止出現(xiàn)亂加減的現(xiàn)象
- {
- delayms(20);//延時(shí)等待
- keys++;//計(jì)數(shù)器加 1
- if(keys == 50)break;//達(dá)到 1 秒沒有復(fù)位,開關(guān)卡住了,退出繼續(xù)掃描開關(guān)
- }
- }
- P3 = ~tmp; //輸出到P0
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
一個(gè)旋轉(zhuǎn)編碼器 LCD1602的驅(qū)動(dòng)程序.doc
(29.5 KB, 下載次數(shù): 77)
2018-11-13 12:18 上傳
點(diǎn)擊文件名下載附件
|