历史上的今天
今天是:2025年08月12日(星期二)
2018年08月12日 | PIC单片机驱动LCD断码屏代码生成工具
2018-08-12 来源:eefocus
PIC 16系列单片机部分型号都带有LCD(断码)驱动模块,
在编写这部分代码的过程中发现对驱动管脚赋值逻辑有很大的重复部分。
所以写了一个宏函数,自动生成驱动逻辑。
断码屏与驱动管脚对应关系
断码屏的一位一般由8段构成:A,B,C,D,E,F,G,DP。
构成对应图形:
AAAAAA
F B
F B
F B
GGGGGG
E C
E C
E C
DDDDDD DP
每段对应PIC单片机的一个驱动管脚。而这个管脚由PIC单片机LCD驱动模块的LCDDATAX寄存器
控制。通过PIC的寄存器映射头文件可以表示为COMxSEGy。
头文件进行管脚配置
首先定义每一位的各个段:
#define LCD_A1 SEGx1COMy1
#define LCD_B1 SEGx2COMy2
#define LCD_C1 SEGx3COMy3
#define LCD_D1 SEGx4COMy4
#define LCD_E1 SEGx5COMy5
#define LCD_F1 SEGx6COMy6
#define LCD_G1 SEGx7COMy7
#define LCD_DP1 SEGx8COMy8
不同的数字由各段的亮暗来表示。例如第一位数字0表示为:
LCD_A1 = 1;
LCD_B1 = 1;
LCD_C1 = 1;
LCD_D1 = 1;
LCD_E1 = 1;
LCD_F1 = 1;
LCD_G1 = 0;
之后还需要定义数字位图,例如数字1和0定义为:
#define LCD_DIGIT_0 (LCD_SEG_A|LCD_SEG_B|LCD_SEG_C|LCD_SEG_D|LCD_SEG_E|LCD_SEG_F)
#define LCD_DIGIT_1 (LCD_SEG_B|LCD_SEG_C)
函数自动生成
之后对断码屏的每一位显示来说,就是对相应管脚的0,1赋值。利用定义好的
命名规则可以利用宏函数来自动生成对应的显示函数。
#define SEG_VALUE(seg, num, character) \
if (character&LCD_SEG_##seg) \
{ \
LCD_##seg##num = 1; \
} \
else \
{ \
LCD_##seg##num = 0; \
}
#define SEG_GENERATE(num) \
SEG_VALUE(A, num, character) \
SEG_VALUE(B, num, character) \
SEG_VALUE(C, num, character) \
SEG_VALUE(D, num, character) \
SEG_VALUE(E, num, character) \
SEG_VALUE(F, num, character) \
SEG_VALUE(G, num, character) \
#define generate_begin(page) \
void lcd_##page##_display_value(unsigned char column, unsigned char character) \
{ \
switch (column) \
{
#define generate_end() \
default: \
break; \
} \
}
#define gnerate_column(col, num) \
case col: \
SEG_GENERATE(num); \
break;
/*define generate micro-define*/
/*need add generate_column logic*/
#define generate_page1_lcd_display_value() \
generate_begin(page1) \
gnerate_column(LCD_COLUMN_1, 1) \
gnerate_column(LCD_COLUMN_2, 2) \
gnerate_column(LCD_COLUMN_3, 3) \
gnerate_column(LCD_COLUMN_4, 4) \
generate_end()
/*void lcd_page1_display_value(unsigned char column, unsigned char character)*/
generate_page1_lcd_display_value()
结束
生成显示函数以后可以像如下调用:
lcd_page1_display_value(LCD_COLUMN_1, LCD_DIGIT_0);
1
在这里只是贴出了一个梗概,其中很多细节并没有写到,后续会考虑在github
上贴出完整代码。
如果有不明白的地方,尽可以提出。
上一篇:PIC单片机配置字
下一篇:PIC单片机之PIC16F884
史海拾趣
|
《模拟CMOS集成电路设计》作者:毕查德.拉扎维_PDF下载 模拟集成电路的设计与其说是一门技术,还不如说是一门艺术。它比数字集成电路设计需要更严格的分析和更丰富的直觉。严谨坚实的理论无疑是严格分析能力的基石,而设计者的实践经验无疑是诞生丰富直觉的源泉。这也正足初学者对学习模拟集成电路设计 ...… 查看全部问答> |
|
网上很多网友都反映altium designer在某些方面还是优于10年经典版protel99se ,所以在空闲之余也下载了一个免安装绿化版的altium designer折腾了下。希望altium designer不要追究我使用了盗版的altium designer,只因个人财力有限。折腾不起正版。 ...… 查看全部问答> |
|
小弟初学,还望各位大师多多指教。我想用34063做一个+18V输入-18V输出的电路,希望输出电流能到2A,纹波要求不高500mV一下就可以。自己用TIP31C照着datasheet上的图搭了个电路,无负载(断开)的时候可以输出18V,然后我用8Ohm的电阻测带载能力,输 ...… 查看全部问答> |
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; //设置为EXTI0 但是编译的时候却说“EXTI0_IRQChannel”没有定义,之后我吧其他的在固件库使用手册中给的中断的定义试了一下,都不行 ...… 查看全部问答> |
|
没有去的朋友,看看图片,看完赶紧去啊,呵呵 复合式土压平衡盾构机 “蛟龙号”深海探测器 南极科考机器人—海燕飞行器机器人 拳击对战机器人 未来工程师 单兵战术机器人 双足人形机器人 3D打印机 机器鱼 排爆机器 ...… 查看全部问答> |
|
宿舍请个保姆是不可能的事情,不过我们可以通过蓝牙和单片机的结合设计一个电子宿舍保姆。早上系统闹钟会按时提醒我们起床,之后会通过该模块上的各种传感器给我们指出当前环境情况。再有单片机与继电器相连,很方便的通过蓝牙来遥控宿舍内电灯、风 ...… 查看全部问答> |
|
如果你输入3个关键字“电阻器”Baidu一下,你会发现很多与电阻器有关的信息。电阻器是一种最常用的元器件,虽然看起来简单,如果使用者对电阻器的了解不深入,势必将会影响到电路指标和产品质量。比如,设计一个高精度的温度采集器,则对电阻器的选 ...… 查看全部问答> |




