打印
[PIC®/AVR®/dsPIC®产品]

关于ht1621的使用和初始化....

[复制链接]
5201|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Rain_King|  楼主 | 2013-8-4 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于是初次接触这个..所以有很多东西不是很懂:
1、首先是ht1621的初始化,给一个高电平脉冲,指的是CS端直接置1,还是先置0,再置1;
2、ht1621的数据传输时(比如写的模式),在WR由高电平变为低电平,和低电平变为高电平,这个时间最大和最小是多少,也就是说这个周期是多少;
3,下面根据自己写的一段程序,不知道哪里错了,就是没法显示数据
说一下自己程序的思路:只显示一个数码管的值,在0-9之间循环逐渐递增,时间是由定时器来完成的。下面就是我的程序了
#include<PIC18F25K22.h>


#define LCD_CS1 PORTCbits.RC7
#define LCD_CS2 PORTCbits.RC6
#define LCD_WR PORTCbits.RC5
#define LCD_DA PORTCbits.RC4


#define SCAN_KEY_A PORTAbits.RA3
#define SCAN_KEY_B PORTAbits.RA5
//#define POWER_KEY PORTAbits.RA4

#define LCD PORTBbits.RB1

#define uchar unsigned char

#define WRITEDATA 0x05
#define WRITECMD 0x04

#define BIAS 0x52        //0b1000 0101 0010 1/3duty 4com
#define SYSDIS 0X00      //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X02      //0b1000 0000 0010 打开系统振荡器

#define LCDOFF 0X04    //0b1000 0000 0100 关LCD偏压
#define LCDON 0X06     //0b1000 0000 0110 打开LCD偏压
#define XTAL 0x28      //0b1000 0010 1000 外部接时钟
#define RC256 0X30     //0b1000 0011 0000 内部时钟
#define TONEON 0X12    //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10   //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A    //0b1000 0000 1010 禁止看门狗

#define HIGHLEVEL 1
#define LOWLEVEL 0

#define ONES 1
#define TWOS 2

#define NOP() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")


const uchar ScreenAddHigh[2][16]={{1,3,5,11,8,10,13,15,17,31,20,22,24,30,27,29},
                                                               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
const uchar ScreenAddLow[2][16]={{0,2,4,6,7,9,12,14,16,18,19,21,23,25,26,28},
                                                              {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
const uchar ScreenDataO[1][10]={{0XBF,0X07,0XDD,0X5F,0X67,0X7D,0XED,0X17,0XFF,0X77}};
const uchar ScreenDataT[1][10]={{0XBF,0X07,0XDD,0X5F,0X67,0X7D,0XED,0X17,0XFF,0X77}};


uchar Count;

void DelayUS(uchar us)                 //delay us
{
         while(--us);
}

void DelayMS(uchar iMs)               //delay ms
{
         uchar i,j;
         for(i=0;i<iMs;i++)
                 for(j=0;j<65;j++)
                         DelayUS(1);
}

void InitSet();                             //初始化

void TransmitToHt(uchar Data,uchar Digit);     //这个是传送数据的
void WriteToHt(uchar Data,uchar Address);      //这个是写入DATA和地址数据的
void WriteCmdHt(uchar Cmd);                        //这个是写入命令数据的
void DisplayScreen(uchar CooSN,uchar Coordinate,uchar Data);//这个是我的自己想的一种方法,就是将频幕设置成坐标点,话剧话
                                            //说,就是将每8位设置一个坐标,那么32个就可以分为16个坐标点,第一个参数是屏
                                           //幕的坐标,由于我需要显示多个频幕(这个可以忽略不计),第二个参数是在一个屏幕里的坐标了,这个
                                          //坐标是自己定义的,最后一个参数是数据。不知道说清楚了没。



void main()
{

         InitSet();
         
         while(1)
         {
                 switch(Count)
                 {
                         case 0:
                         {
                                 DisplayScreen(ONES,0,0);
                                 break;
                         }
                         case 1:
                         {
                                 DisplayScreen(ONES,0,1);
                                 break;
                         }
                         case 2:
                         {
                                 DisplayScreen(ONES,0,2);
                                 break;
                         }
                         case 3:
                         {
                                 DisplayScreen(ONES,0,3);
                                 break;
                         }
                         case 4:
                         {
                                 DisplayScreen(ONES,0,4);
                                 break;
                         }
                         case 5:
                         {
                                 DisplayScreen(ONES,0,5);
                                 break;
                         }
                         case 6:
                         {
                                 DisplayScreen(ONES,0,6);
                                 break;
                         }
                         case 7:
                         {
                                 DisplayScreen(ONES,0,7);
                                 break;
                         }
                         case 8:
                         {
                                 DisplayScreen(ONES,0,8);
                                 break;
                         }
                         case 9:
                         {
                                 DisplayScreen(ONES,0,9);
                                 break;
                         }
                         default :break;
                 }
                        
         }
}


void interrupt ISR(void)
{
         if(TMR0IF&&TMR0IE)
         {
                 ++Count;
                 if(Count==10)
                 {
                         Count=0;
                 }
                 TMR0IF=0;
                 
         }
}

void InitSet()
{

         Count=0;
         
         LCD_CS1=1;
         LCD_CS2=1;
         LCD_DA=1;
         LCD_WR=1;
         
         DelayMS(2000);
         
         WriteCmdHt(BIAS);
         WriteCmdHt(RC256);
         WriteCmdHt(SYSDIS);
         WriteCmdHt(WDTDIS);
         WriteCmdHt(SYSEN);
         WriteCmdHt(LCDON);
         
         TRISC=0b0000000;
         ANSC2=0;
         ANSC3=0;
         ANSC4=0;
         ANSC5=0;
         ANSC6=0;
         ANSC7=0;
         
         GIE=1;
         PEIE=1;
         TMR0ON=1;
         T08BIT=0;
         T0CS=0;
         T0SE=1;
         PSA=1;
         //T0PS0=1;
         //T0PS1=1;
         //T0PS2=1;
         
         TMR0IE=1;
         TMR0IF=0;
}

void TransimToHt(uchar Data,uchar Digit)
{
         uchar i;
         uchar Tem=0x01;
         for(i=0;i<Digit;i++)
         {
                 LCD_WR=LOWLEVEL;
                 LCD_DA=Data&Tem;     //Transim Low Digit
                 NOP();
                 LCD_WR=HIGHLEVEL;
                 NOP();
                 Data>>=1;
         }
}



void WriteToHt(uchar Data,uchar Address)
{
         LCD_CS1=LOWLEVEL;
         NOP();
         TransimToHt(WRITEDATA,3);
         TransimToHt(Address,6);
         TransimToHt(Data,4);
         LCD_CS1=HIGHLEVEL;
         NOP();
}


void WriteCmdHt(uchar Cmd)
{
         LCD_CS1=LOWLEVEL;
         NOP();
         TransimToHt(WRITECMD,3);
         TransimToHt(Cmd,9);
         LCD_CS1=HIGHLEVEL;
         NOP();
}


void DisplayScreen(uchar CooSN,uchar Coordinate,uchar Data)
{
         uchar DataLow,DataHigh;
         uchar LowAddress,HighAddress;
         if(CooSN==ONES)
         {
                 DataHigh=ScreenDataO[Coordinate][Data]/0x10;
                 DataLow=ScreenDataO[Coordinate][Data]%0x10;
         }
         else
         {
                 DataHigh=ScreenDataT[Coordinate][Data]/0x10;
                 DataLow=ScreenDataT[Coordinate][Data]%0x10;
         }
         LowAddress=ScreenAddLow[CooSN][Coordinate];
         HighAddress=ScreenAddHigh[CooSN][Coordinate];
         
         WriteToHt(DataHigh,HighAddress);
         WriteToHt(DataLow,LowAddress);        
}

沙发
Rain_King|  楼主 | 2013-8-4 11:35 | 只看该作者
主要帮我看看传送数据、命令和地址是否有错误...其他的可以忽略...

使用特权

评论回复
板凳
Rain_King|  楼主 | 2013-8-4 12:08 | 只看该作者
人呢??都去哪里了???

使用特权

评论回复
地板
Rain_King|  楼主 | 2013-8-4 18:23 | 只看该作者
难道是程序多了....没有人看??

使用特权

评论回复
5
dogglove| | 2013-8-6 11:47 | 只看该作者
没有人有耐心看这么多啊,还是自己领会要点吧,要有学习能力啊

使用特权

评论回复
6
yewuyi| | 2013-8-6 14:16 | 只看该作者
HT1621的范例代码在网上很多,你自己百度一些,然后参照着写就是了。

另外在HOLTEK的官方网站上也有一些示范代码,别管是那个单片机的,其实基本的操作都是相同的,依葫芦画瓢翻译成你当前所用的单片机程序即可。

具体怎么翻译,显然没人愿意帮你这个忙。

使用特权

评论回复
7
Rain_King|  楼主 | 2013-8-9 23:01 | 只看该作者
虽然没有说出解决方法........不过告诉我需要努力啊............

使用特权

评论回复
8
zqy890520| | 2014-8-14 15:28 | 只看该作者
楼主,请问你弄出来了吗?我现在也面临这个问题,虽然说网上例程很多,我就只是将液晶全部点亮,貌似初始化都没有进去,很是着急,请问楼主,解决了吗?

使用特权

评论回复
9
Rain_King|  楼主 | 2014-8-14 17:28 | 只看该作者
zqy890520 发表于 2014-8-14 15:28
楼主,请问你弄出来了吗?我现在也面临这个问题,虽然说网上例程很多,我就只是将液晶全部点亮,貌似初始化 ...

怎么说......你是已经工作了么...还是学生....

使用特权

评论回复
10
panchunjiang| | 2014-10-14 21:12 | 只看该作者
自学PIC,建筑专业毕业的学生,汇编熟悉,单片机不怎么熟悉,架构一般,电路图不会看 求指教

使用特权

评论回复
11
Rain_King|  楼主 | 2014-10-15 08:33 | 只看该作者
panchunjiang 发表于 2014-10-14 21:12
自学PIC,建筑专业毕业的学生,汇编熟悉,单片机不怎么熟悉,架构一般,电路图不会看 求指教 ...

请教就太夸张了....有什么问题可以发帖的....看到了,会的自然会告诉你的

使用特权

评论回复
12
panchunjiang| | 2014-10-15 09:48 | 只看该作者
Rain_King 发表于 2014-10-15 08:33
请教就太夸张了....有什么问题可以发帖的....看到了,会的自然会告诉你的

单片机初始化设置的时候老卡,电路图也不会看

使用特权

评论回复
13
panchunjiang| | 2014-10-15 09:51 | 只看该作者
我的意思是,你初始化单片机的时候有电路基础?

使用特权

评论回复
14
Rain_King|  楼主 | 2014-10-15 10:55 | 只看该作者
panchunjiang 发表于 2014-10-15 09:51
我的意思是,你初始化单片机的时候有电路基础?

搞单片机的都有电路基础,什么模电,数电,虽然忘的差不多了,但是肯定是学过的....还有神马叫单片机初始化,你应该说的更具体点...

使用特权

评论回复
15
HOLTEK单片机| | 2015-9-15 22:06 | 只看该作者
哈哈

使用特权

评论回复
16
UPS2015| | 2015-9-16 08:58 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:努力学习,积极回复,只为申请版主.......

29

主题

784

帖子

4

粉丝