標題:
HT1621B初始化后總是顯示亂碼 有沒有大神可以幫忙解決
[打印本頁]
作者:
ytyhh626
時間:
2020-4-1 10:23
標題:
HT1621B初始化后總是顯示亂碼 有沒有大神可以幫忙解決
用的是STC8F2K16S2單片機
連接液晶顯示 SEG9-SEG27 COM0-COM3
#include "STC8F.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
#define BIAS 0X52 //必須跟硬件電路的COM匹配,1個或者2個COM 0x42 3個COM 0X4A 4個COM 0x52 1/3LCD驅(qū)動器偏壓 4個公共端口COM
#define RC256 0X30
#define SYSTEN 0x02
#define SYSDIS 0x00
#define LCDON 0X06
void sendbitHT1621(uchar nbit,uchar n);//發(fā)送一個字節(jié)中的n位到HT1621里,驅(qū)動程序的最底層部分
void write_com(uchar cmdcode);//寫命令到LCD
void init_lcd();//初始化LCD屏
void seg_display(uchar col,uchar pag);//顯示基本單位點
void scerrn_clear();//清空屏幕的內(nèi)容
void delay(); //5s
//說明:凡是輸出IO后綴都是_dr,凡是輸入后綴都是_sr
sbit ht162x_data_dr=P0^0;
sbit ht162x_cs_dr=P0^2;
sbit ht162x_wr_dr=P0^3;
void main()
{
init_lcd();
}
//發(fā)送一個字節(jié)中的N位到HT1621里,驅(qū)動程序的最底層部分//
void sendbitHT1621(uchar nbit,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
ht162x_wr_dr=0;
if(nbit&0x80) //判斷最高位
{
ht162x_data_dr=1;
}
else
{
ht162x_data_dr=0;
}
_nop_();
_nop_();
_nop_();
ht162x_wr_dr=1;
_nop_();
_nop_();
_nop_();
nbit<<=1;
}
}
//寫命令到LCD,驅(qū)動液晶程序的一部分//
void write_com(uchar cmdcode)
{
ht162x_cs_dr=0; //選通HT1621
_nop_();
_nop_();
sendbitHT1621(0x80,4); //寫入命令
sendbitHT1621(cmdcode,8); //寫入控制命令
_nop_();
_nop_();
ht162x_cs_dr=1;
_nop_();
_nop_();
_nop_();
}
void init_lcd()
{
ht162x_data_dr=1;
ht162x_cs_dr=1;
ht162x_wr_dr=1;
write_com(SYSTEN); // 打開系統(tǒng)振蕩器
write_com(RC256); //啟動內(nèi)部256K RC振蕩器
write_com(BIAS); //1/3LCD驅(qū)動器偏壓 4個公共端口COM
write_com(LCDON); //開啟LCD
}
//核心內(nèi)容 顯示基本單位點,col代表X軸,X軸的數(shù)據(jù)用位來表示,一個字節(jié)中的高4位來表示,pag表示Y軸
void seg_display(uchar col,uchar pag)
{
// pag<<=2;
ht162x_cs_dr=0;
_nop_();
_nop_();
sendbitHT1621(0XA0,3); //發(fā)送寫數(shù)據(jù)模式 高位101 101為6 位RAM 地址,
sendbitHT1621(pag<<2,6); //寫入地址數(shù)據(jù)
sendbitHT1621(col,4); //寫入數(shù)據(jù)
ht162x_cs_dr=1;
_nop_();
_nop_();
}
//清空屏幕內(nèi)容
void screen_clrar()
{
uchar i;
uchar y=0;
for(i=0;i<32;i++)
{
seg_display(0X00,y);
y=y+1;
}
}
注:這個還有一個毛病就是每次燒完程序之后 要斷電很久屏幕才會發(fā)生變化,這個也搞不清是什么原因
作者:
wulin
時間:
2020-4-1 10:23
給你一個測試程序參考
#include <STC89C5xRC.H>
//宏定義新LCD的操作命令
#define ComMode 0x52 //4COM,1/3bias 1000 0101 0010
//#define ComMode 0x50 //4COM,1/2bias 1000 0101 0000
#define RCosc 0x30 //內(nèi)部RC振蕩器(上電默認)1000 0011 0000
#define LCD_on 0x06 //打開LCD顯示 偏壓發(fā)生器1000 0000 0110
#define LCD_off 0x04 //關(guān)閉LCD顯示(上電默認)
#define Sys_en 0x02 //系統(tǒng)振蕩器開 1000 0000 0010
#define Ctrl_cmd 0x80 //寫控制命令 1000
#define Data_cmd 0xa0 //寫數(shù)據(jù)命令 1010
// 端口聲明
sbit DIPIN=P3^7;
sbit CLKPIN=P3^6;
sbit CSPIN=P3^5;
/**-------------------------------------------------------------------------
Name: SendBit_1621(送數(shù)據(jù)程序)
---------------------------------------------------------------------------*/
void SendBit_1621(unsigned char sdata,unsigned char cnt) //sdata 的高cnt 位寫入HT1621,高位在前
{
unsigned char i;
for(i=0;i<cnt;i++)
{
CLKPIN=0;
if(sdata&0x80)
DIPIN=1;
else DIPIN=0;
CLKPIN=1;
sdata<<=1;
}
}
/*-------------------------------------------------------------------------
Name: SendCmd(送命令)
寫入標志碼"100"和9位comma命令,由于沒有使用到更改時鐘輸出等命令
為了編程方便直接將command 的最高位寫"0"
---------------------------------------------------------------------------*/
void SendCmd_1621(unsigned char command)//寫命令
{//3位標志碼 + 9位命令,共12位
CSPIN=0; //執(zhí)行一個下降沿
SendBit_1621(0x80,4); //寫入標志碼"100"和9位comma命令的最高1位共4位
SendBit_1621(command,8); //寫入9位comma命令的后8位,組成1000 xxxx xxxx
CSPIN=1;//送數(shù)完成后置高電平
}
/**-------------------------------------------------------------------------
Name: Write_1621(送命令和數(shù)據(jù)程序)
寫入標志碼"101"和6位addr地址碼和8位sdata顯示數(shù)據(jù)。
---------------------------------------------------------------------------*/
void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//寫數(shù)據(jù)
{//3位標志碼 + 6位寫數(shù)據(jù)命令 + len(4/8)位數(shù)據(jù),共13/17位
addr<<=2;//高6位有效
CSPIN=0; //執(zhí)行一個下降沿
SendBit_1621(0xa0,3); //寫入標志碼"101" 寫數(shù)據(jù)命令101
SendBit_1621(addr,6); //寫入addr 的高6位 寫數(shù)據(jù)命令xxxx xx
SendBit_1621(sdata,len); //寫入8/4位 sdata數(shù)據(jù) len=8/4
CSPIN=1;//送數(shù)完成后置高電平
}
/**-------------------------------------------------------------------------
Name: Init_1621(初始化1621)
-------------------------------------------------------------------------*/
void LCD_Init() //初始化
{//程序輸入100 0+8=9位命令
SendCmd_1621(Sys_en);//Sys_en 0x02 系統(tǒng)振蕩器開 100 0 0000 0010
SendCmd_1621(RCosc); //RCosc 0x30 內(nèi)部RC振蕩器(上電默認) 100 0 0011 0000
SendCmd_1621(ComMode);//4COM,1/3bias 100 0 0101 0020
SendCmd_1621(LCD_on);//LCD_on 0x06 打開LCD顯示 偏壓發(fā)生器100 0 0000 0110
}
/*-------------------------------------------------------------------------
Name: lcdwd1(點亮1621全部Seg)
-------------------------------------------------------------------------*/
void lcdwd1(unsigned char num)
{
unsigned char i;
unsigned char addr=0;//寄存器起始地址0x00
for(i=0;i<num;i++)//num有效地址數(shù)
{
Write_1621(addr,0xff,8);//addr為地址,0xff為數(shù)據(jù),8為8位數(shù)據(jù)
addr+=2;//順延2個4位地址碼
}
}
void main()
{
LCD_Init();
while(1)
{
lcdwd1(16);
}
}
復制代碼
作者:
man1234567
時間:
2020-4-2 10:14
換個屏試試以排除硬件故障。
作者:
f556
時間:
2020-4-2 11:26
我遇到過,后來知道怎么應(yīng)對各種不同PCB的HT1621了。
1針對不同的HT1621必須確定是2COM、還是4COM,1COM(靜態(tài)驅(qū)動)、3COM的較少。
2、必須確定段碼地址,你可以寫一個TEST_seg(),掃描各個段,每段停一下并記下地址
3、根據(jù)段碼編寫碼表,心里要理清對應(yīng)的位。
搞清楚上述兩點基本就不會亂碼了,不是硬件問題,基本是程序問題。 另外2com是一次地址寫兩段,4com是一次寫4段,HT1621每次就是寫4個bit的,剛好方便。2com的麻煩一些。
作者:
JACK_WEI
時間:
2021-6-30 23:30
wulin 發(fā)表于 2020-4-1 10:23
給你一個測試程序參考
謝謝 你了
作者:
JACK_WEI
時間:
2021-7-2 00:21
JACK_WEI 發(fā)表于 2021-6-30 23:30
謝謝 你了
調(diào)試通了,謝謝你的資料
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1