这个板块没有51热闹,但是编程简单,可以有更多的精力去创意,其实没有创意和灵魂的东西永远不会成为经典。
制作出来的实物图如下:
Arduino程序源码:
- #define ENCODER_A_PIN 2
- #define ENCODER_B_PIN 3
- #define SWITCH_PIN 4
- long position;//
- int latchPin = 8;//RS
- int dataPin = 9;//RW
- int clockPin =10;//EN
- unsigned char tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9数字
- void setup()
- {
- //setup our pins 初始化我们的需要的引脚
- pinMode(ENCODER_A_PIN, INPUT);
- pinMode(ENCODER_B_PIN, INPUT);
- pinMode(SWITCH_PIN, INPUT);
- attachInterrupt(0, read_quadrature, CHANGE);
- pinMode(latchPin, OUTPUT); //设置引脚为输出
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
- Lcdint( );//lcd
- }
- ////////////////////////////写SPI时序,具体参考shiftout 命令使用/////////////////////////////
- void WriteByte(int dat)
- {
- digitalWrite(latchPin, HIGH);
- shiftOut(dataPin, clockPin, MSBFIRST, dat);
- digitalWrite(latchPin, LOW);
- }
- ///////////////////写命令/////////////////////////////////////
- void LcdCommandWrite(int value) {
- int H_data,L_data;
- H_data = value;
- H_data &= 0xf0; //屏蔽低4位的数据
- L_data = value; //xxxx0000格式
- L_data &= 0x0f; //屏蔽高4位的数据
- L_data <<= 4; //xxxx0000格式
- WriteByte(0xf8); //RS=0,写入的是指令;
- WriteByte(H_data);
- WriteByte(L_data);
- }
- //////////////////////写数据/////////////////////////////////////
- void LcdDataWrite(int value) {
- int H_data,L_data;
- H_data = value;
- H_data &= 0xf0; //屏蔽低4位的数据
- L_data = value; //xxxx0000格式
- L_data &= 0x0f; //屏蔽高4位的数据
- L_data <<= 4; //xxxx0000格式
- WriteByte(0xfa); //RS=1,写入的是数据
- WriteByte(H_data);
- WriteByte(L_data);
- }
- ////////////////////// /////////////////////////////////////
- void Lcdint(void)
- {
- LcdCommandWrite(0x30); // 设定为基本指令
- delay(5);
- LcdCommandWrite(0x03); // //允许输入卷动位址
- delay(5);
- LcdCommandWrite(0x0c); // //脱离随眠状态,显示打开,关光标,反白关.
- delay(5);
- LcdCommandWrite(0x01); // 清屏指令.
- delay(5);
- LcdCommandWrite(0x06); // AC自动加一,光标右移,整体显示不移动
- delay(5);
- }
- void LCD_zfc(char *p)//定义一个带指针的函数?(字符串)
- {
- while(*p!=0)//不能用";"
- LcdDataWrite(*p++);
- }
- <font style="font-size: 36.9444px"> /************************显示1 *********************************/ </font>
- void display1(void)
- {
- int dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- long temp ; //存放温度值的10倍=12345678;
- temp=position;//旋转
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
-
- LcdCommandWrite(0x98);//LCD12864_W ((0或1),****) 0写指令 1写数据
- // 0xCE,0xC2,0xB6,0xC8
- LcdDataWrite(0xd0 );
- LcdDataWrite(0xfd );
- LcdDataWrite(0xd7 );
- LcdDataWrite(0xaa );
- LcdDataWrite(0x3a);// .
- // LcdDataWrite(tabe[dt8]);//8位
- //LcdDataWrite(tabe[dt7]);//7位
- // LcdDataWrite(tabe[dt6]);//6位
- //LcdDataWrite(tabe[dt5]);//5位
- LcdDataWrite(tabe[dt4]);//4位
- LcdDataWrite(tabe[dt3]);//3位
- //LcdDataWrite(0x2e);// .....
- LcdDataWrite(tabe[dt2]);//2位
- LcdDataWrite(tabe[dt1]);//1位
- LCD_zfc(" R");
- }
- void read_quadrature()
- {
- if (digitalRead(ENCODER_A_PIN) == LOW)
- {
- if (digitalRead(ENCODER_B_PIN) == LOW)
- position++;
- if(position>1000)position=1000;
- }
- else
- {
- if (digitalRead(ENCODER_B_PIN) == LOW)
- position--;
- if(position<0)position=0;
- }
- if (digitalRead( SWITCH_PIN ) == LOW)
- {
- position=0;
- }
- }
- void loop()
- {
- display1();//旋转
- read_quadrature();
- }
复制代码
全部资料51hei下载地址:
128显旋转编码器OK2.zip
(2.07 KB, 下载次数: 30)
|