单片机IO直接驱动段式LCD详细说明+代码
常规原理说明可看其他博主,下面说一下调试过程遇到的问题点。
1.注意段式LCD的供电电压,选与供电电压接近的电压供电。驱动电压注意是是1/2偏压还是1/3偏压。
2.注意LCD的观察方向,12点方向还是6点方向,部分LCD有可能观察方向不同会有鬼影。
3.注意扫描频率,一般在50-250hz
4.COM口的上下拉电阻必须一致,不然可能出现鬼影
5.在SEG段不点亮的情况下,也要交替翻转盖引脚,用于消除鬼影。网上部分例程在不点亮时直接拉低,容易出现鬼影。
6.每个周期内的高低电平时间必须一样,因此在更新数据是切记在扫描完一轮周期以后。
下面附上 1/3Duty 1/2 BIAS的LED的调试代码
/*
MCU PIN P17 P16 P15 P14 P13 P12 P11 P10 P27 P26 P25 P24 P23 P22 P21 P20
LCD PIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
LCD PIN name COM0 COM1 COM2 SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7 SEG8 SEG9 SEG10 SEG11 SEG12
COM0 -- -- -- 1D -- -- 2D COL -- 3D -- -- 4D --
-- COM1 -- 1E 1G 1C 2E 2G 2C 3E 3G 3C 4E 4G 4C
-- -- COM2 1F 1A 1B 2F 2A 2B 3F 3A 3B 4F 4A 4B
*/
/*
段码 //自定义每段的值 对应上述的PIN
- -A -- //0x01 0x02 0x04 -- D --
F B //0x08 0x10 0x20 E G C
-- G -- //0x40 0x80 0x100 F A B
E C
-- D --
*/
#define NUM0 0x01EF//A B C D E F = 0x80 0x100 0x20 0x02 0x08 0x40
#define NUM1 0x0120//B C
#define NUM2 0x019A//A B G E D
#define NUM3 0x01B2//A B G C D
#define NUM4 0x0170//F G B C
#define NUM5 0x00F2//A F G C D
#define NUM6 0x00ff//A F E D C G
#define NUM7 0x01A0//A B C
#define NUM8 0x01FF//B C
#define NUM9 0x01F7//A B C D F G
/*开启的位数
1 2 3 4 5 6
0x01 0x02 0x04 0x08 0x10 0x20
*/
#define WEI_NUM 0x03 //开启的位数//0x03=0x01 0x02
//
unsigned int wei1_num=NUM0;
unsigned int wei2_num=NUM0;
void LCD_deal(void) //定时器配置5ms扫描一次即可
{
switch(ScanCoun) //动态扫描
{
case 0: //COM0 正向驱动
COM1_F=1|(1<<6)|(1<<7);
COM2_F=1|(1<<6)|(1<<7);
COM0_P=0; //数据
COM0_F=2;
if(WEI_NUM&0x01) //第一位
{
if(wei1_num&0x01) SEG1=1; else SEG1=0;
if(wei1_num&0x02) SEG2=1; else SEG2=0;
if(wei1_num&0x04) SEG3=1; else SEG3=0;
}
if(WEI_NUM&0x02) //第二位
{
if(wei2_num&0x01) SEG4=1; else SEG4=0;
if(wei2_num&0x02) SEG5=1; else SEG5=0;
SEG6=1; //对应的冒号常开
}
break;
case 3: //COM0 反向驱动
COM1_F=1|(1<<6)|(1<<7);
COM2_F=1|(1<<6)|(1<<7);
COM0_P=1;
COM0_F=2;
if(WEI_NUM&0x01)
{
if(wei1_num&0x01) SEG1=0;else SEG1=1;
if(wei1_num&0x02) SEG2=0;else SEG2=1;
if(wei1_num&0x04) SEG3=0;else SEG3=1;
}
if(WEI_NUM&0x02)
{
if(wei2_num&0x01) SEG4=0;else SEG4=1;
if(wei2_num&0x02) SEG5=0;else SEG5=1;
//if(wei2_num&0x04)
SEG6=0; //冒号
}
break;
case 1: //COM1 正向驱动
COM0_F=1|(1<<6)|(1<<7); //除COM1输出外,其余COM设为输入
COM2_F=1|(1<<6)|(1<<7);
COM1_P=0;
COM1_F=2;
if(WEI_NUM&0x01)
{
if(wei1_num&0x08) SEG1=1; else SEG1=0;
if(wei1_num&0x10) SEG2=1; else SEG2=0;
if(wei1_num&0x20) SEG3=1; else SEG3=0;
}
if(WEI_NUM&0x02)
{
if(wei2_num&0x08) SEG4=1;else SEG4=0;
if(wei2_num&0x10) SEG5=1;else SEG5=0;
if(wei2_num&0x20) SEG6=1;else SEG6=0;
}
break;
case 4: //COM1 反向驱动
COM0_F=1|(1<<6)|(1<<7); //除COM1输出外,其余COM设为输入
COM2_F=1|(1<<6)|(1<<7);
COM1_P=1;
COM1_F=2;
if(WEI_NUM&0x01)
{
if(wei1_num&0x08) SEG1=0;else SEG1=1;
if(wei1_num&0x10) SEG2=0;else SEG2=1;
if(wei1_num&0x20) SEG3=0;else SEG3=1;
}
if(WEI_NUM&0x02)
{
if(wei2_num&0x08) SEG4=0;else SEG4=1;
if(wei2_num&0x10) SEG5=0;else SEG5=1;
if(wei2_num&0x20) SEG6=0;else SEG6=1;
}
break;
case 2:
COM0_F=1|(1<<6)|(1<<7); //除COM2输出外,其余COM设为输入
COM1_F=1|(1<<6)|(1<<7);
COM2_P=0;
COM2_F=2;
if(WEI_NUM&0x01)
{
if(wei1_num&0x40) SEG1=1;else SEG1=0;
if(wei1_num&0x80) SEG2=1;else SEG2=0;
if(wei1_num&0x100) SEG3=1;else SEG3=0;
}
if(WEI_NUM&0x02)
{
if(wei2_num&0x40) SEG4=1;else SEG4=0;
if(wei2_num&0x80) SEG5=1;else SEG5=0;
if(wei2_num&0x100) SEG6=1;else SEG6=0;
}
break;
case 5:
COM0_F=1|(1<<6)|(1<<7); //除COM2输出外,其余COM设为输入
COM1_F=1|(1<<6)|(1<<7);
COM2_P=1;
COM2_F=2;
if(WEI_NUM&0x01)
{
if(wei1_num&0x40) SEG1=0;else SEG1=1;
if(wei1_num&0x80) SEG2=0;else SEG2=1;
if(wei1_num&0x100) SEG3=0;else SEG3=1;
}
if(WEI_NUM&0x02)
{
if(wei2_num&0x40) SEG4=0;else SEG4=1;
if(wei2_num&0x80) SEG5=0;else SEG5=1;
if(wei2_num&0x100) SEG6=0;else SEG6=1;
}
break;
}
ScanCoun ;// 下一位
if(ScanCoun>5) //扫描完一轮才更新数值,否则会出现鬼影
{
ScanCoun=0;
switch(timer_value0/10)
{
case 0: wei1_num=NUM0; break;
case 1: wei1_num=NUM1; break;
case 2: wei1_num=NUM2; break;
case 3: wei1_num=NUM3; break;
case 4: wei1_num=NUM4; break;
case 5: wei1_num=NUM5; break;
case 6: wei1_num=NUM6; break;
case 7: wei1_num=NUM7; break;
case 8: wei1_num=NUM8; break;
case 9: wei1_num=NUM9; break;
}
switch(timer_value)
{
case 0: wei2_num=NUM0; break;
case 1: wei2_num=NUM1; break;
case 2: wei2_num=NUM2; break;
case 3: wei2_num=NUM3; break;
case 4: wei2_num=NUM4; break;
case 5: wei2_num=NUM5; break;
case 6: wei2_num=NUM6; break;
case 7: wei2_num=NUM7; break;
case 8: wei2_num=NUM8; break;
case 9: wei2_num=NUM9; break;
}
switch(timer_value00/100)
{
case 0: wei3_num=NUM0; break;
case 1: wei3_num=NUM1; break;
case 2: wei3_num=NUM2; break;
case 3: wei3_num=NUM3; break;
case 4: wei3_num=NUM4; break;
case 5: wei3_num=NUM5; break;
case 6: wei3_num=NUM6; break;
case 7: wei3_num=NUM7; break;
case 8: wei3_num=NUM8; break;
case 9: wei3_num=NUM9; break;
}
switch(timer_value)
//switch(timer_value/1000)
{
case 0: wei4_num=NUM0; break;
case 1: wei4_num=NUM1; break;
case 2: wei4_num=NUM2; break;
case 3: wei4_num=NUM3; break;
case 4: wei4_num=NUM4; break;
case 5: wei4_num=NUM5; break;
case 6: wei4_num=NUM6; break;
case 7: wei4_num=NUM7; break;
case 8: wei4_num=NUM8; break;
case 9: wei4_num=NUM9; break;
}
}
}
只做记录,不足之处请指出,谢谢!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkkghb
-
excel图片置于文字下方的方法
PHP中文网 06-27 -
微信小程序没声音怎么办
PHP中文网 06-15 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
微信人名旁边有个图标有什么用
PHP中文网 03-11 -
微信提示登录环境异常是什么意思原因
PHP中文网 04-09 -
微信获取用户openid失败怎么办
PHP中文网 03-26 -
photoshop怎么把印章抠出并放在另一张图上
PHP中文网 06-15 -
EhViewer(E绅士)最新版_ehviewer白色版彩色版_Ehviewer显示网络错误怎么办?e站进不去了怎么办
Evanpatchouli 09-19 -
Excel筛选和排序是灰色的怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24