|
楼主 |
发表于 2013-3-4 21:31:16
|
显示全部楼层
本帖最后由 风云天 于 2013-3-4 21:41 编辑
sf49ers 发表于 2013-3-3 23:10
仔细看了你的程序,你是对1621的用法还没理解
程序大概应该是这样的
嗯,谢谢你的提醒了,我知道什么意思了,之前我的编码是先seg0-seg7,而HT1621的是COM0-COM3编码的。
假设要在4位液晶上显示1234,1、2、3、4的seg0-seg7的阳极编码分别为0x06,0x5b,0x4f,0x66,
则HT1621的解法如下图:
如此,可求得seg0-seg7依次发送的COM数据为uchar const table_com[]={0X06,0X0F,0X0B,0X06,0X04,0X01,0X07,0X00};
则写一个LCD4位同时显示1,2,3,4的测试程序如下,
void Ht1621_Write_Num(uchar const *pt)
{
uchar i;
for(i=0;i<8;i++)
{
Ht1621WrOneData(i,pt);
}
}
void main()
{
Ht1621_Init(); //上电初始化LCD
Clear(); //清液晶屏
Ht1621_Write_Num(table_com);
while(1);
}
Ht1621WrOneData(uchar const *p,uchar com);已在前面定义.
我看了阿莫里的所有的关于HT1621的贴子,都没有这样讲解的,初学者一时很难理解HT1621的编码是怎样来得,深有痛感,在此给初学HT1621的童鞋们抛砖引玉,少走弯路。
又看了http://www.amobbs.com/thread-3702274-1-1.html
采用对所写段位先读后写的方式,每次只读写4bit,对数字位,只读写8bit,提高速度。
照他说法,每次写一个COM数据都要先读,对HT1621的操作不是又多了好多行代码,也一样占用单片机很多的执行时间啊(多了操作读-修改-写HT1621,且HT1621的时钟频率只有256KHz的),大大降低了MCU执行速度,而且也不易理解,还定义了两个数据的容量,一样占用空间,当然是ROM了
定义两个数组
const unsigned int BUFFER0[10]={0xEB00,0x6000,0xC700,0xE500,0x6C00,0xAD00,0xAF00,
0xE000,0xEF00,0xED00};
const unsigned int BUFFER1[10]={0x0D70,0x0060,0x0E30,0x0A70,0x0360,0x0B50,0x0F50,
0x0070,0x0F70,0x0B70};
我修改的HT1621优化如下:
首先定义2个数组:即用于显示数码管的阳极编码,一个不带点,一个带点
uchar const Num_Table0[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/***************带dp点的0-F的显示编码***************/
uchar const Num_Table1[]={
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1};
然后将这些编码进行转换为HT1621显示:
定义一个显示结构体,因为我是用液晶显示时间的,这样比较方便
typedef struct
{
uchar first; //LCD液晶前2位数据
uchar second; //LCD液晶后2位显示数据
}Struct_Dis_Value;
/******************************
函数:void Ht1621_Display_Num(uchar const *pt,Struct_Dis_Value *S_Value)
功能:LCD显示编码数字0-F,4位
参数:uchar const *pt编码数组;*S_Value:结构体存储待显示的数据
返回值:无
******************************/
void Ht1621_Display_Num(uchar const *pt,Struct_Dis_Value *S_Value)
{
uchar i,j=0x01,senddata=0; //senddat为HT162的COM0数据
uchar ten1=0,ge1=0,ten2=0,ge2=0; //十位和个位
ten1=S_Value->first/10; //十位
ge1=S_Value->first%10; //个位
ten2=S_Value->second/10;
ge2=S_Value->second%10;
for(i=0;i<8;i++)
{
if(ten1!=0) //如first=7,只显示7,不显示07
{
if(pt[ten1] & j)
senddata|=0x08; //COM3-COM0,bit3=1;
}
if(pt[ge1] & j)
{
senddata|=0x04; //bit2=1;
}
if(ten2!=0)
{
if(pt[ten2] & j)
senddata|=0x02;
}
if(pt[ge2] & j)
{
senddata|=0x01;
}
Ht1621WrOneData(i,senddata);//向seg0-seg7地址发送COM口数据
j<<=1; //
senddata=0;
}
}
然后将可使用了
main中:
void main(void)
{
Display_Value.first=12; //初始化显示数据
Display_Value.second=34;
WDTCTL = WDTPW + WDTHOLD;
Set_MSP430_Clock();
Ht1621_Init(); //上电初始化LCD
Delayms(20); //延时一段时间
Clear();
while(1)
{
Ht1621_Display_Num(Num_Table1,&Display_Value);
}
}
硬件图,电路连接图如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|