最近在弄一个段式液晶,用51单片机驱动没问题,把程序移植到stm32上就不行了,实在是搞不明白了,请大家帮忙看看:
这是主函数:
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "out4.h"
void init_all()
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
OUT4_Init();
}
int main(void)
{
init_all();
delay_ms(1000);
Ht1621_Init(); //上电初始化LCD
HT1621_all_off();
HT1622_numdis();
while(1)
{
}
}[/mw_shl_code]
这是调用的段式液晶的驱动函数:
[mw_shl_code=c,true]#include "out4.h"
#include"delay.h"
#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X01 //0b1000 0000 0010 打开系统振荡器
#define LCDOFF 0X02 //0b1000 0000 0100 关LCD偏压
#define LCDON 0X03 //0b1000 0000 0110 打开LCD偏压
#define TIMEDIS 0x04
#define BZOFF 0x05
#define LCDWDTDIS 0x08
#define RC32 0X18 //0b1000 0011 0000 内部时钟
#define BIAS 0x29 //1/3 BIAS 4COM
#define IRQDIS 0x80
#define WDT 0xa0
#define NORMALMODE 0Xe3
//下面是字型码0-F
unsigned char zixingma[16]={0xee,0x42,0xab,0x6b,0x47,0x6d,0xed,0x4a,0xef,0x6f,0xcf,0xe5,0xac,0xe3,0xad,0x8d};
//下面27个是27个完整数字的显示缓存,0-26分别对应YJD113-1的1-27号数字
unsigned char disnum[27]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10};
//unsigned char disnum[27];
/******************************************************
写数据函数,cnt为传送数据位数,数据传送为高位在前
*******************************************************/
void Ht1621Wr_Data(u8 Data,u8 cnt)
{
u8 i;
for (i=0;i<cnt;i++)
{
HT1621_WR=0;
delay_us(3);
HT1621_DAT=Data&0x80;
delay_us(3);
HT1621_WR=1;
delay_us(3);
Data<<=1;
}
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
设 计 人:
版 本:1.0
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(u8 Addr,u8 Data)
{
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data<<4,4); //写入数据
delay_us(3);
HT1621_CS=1;
delay_us(3);
}
void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
delay_ms(1000);
HT1621_CS=0;
//延时使LCD工作电压稳定
delay_ms(30);
Ht1621Wr_Data(0x80,3);
Ht1621Wr_Data(SYSEN,9);
Ht1621Wr_Data(LCDON,9);
Ht1621Wr_Data(TIMEDIS,9);
Ht1621Wr_Data(BZOFF,9);
Ht1621Wr_Data(LCDWDTDIS,9);
Ht1621Wr_Data(RC32,9);
Ht1621Wr_Data(BIAS,9);
Ht1621Wr_Data(IRQDIS,9);
Ht1621Wr_Data(WDT,9);
Ht1621Wr_Data(NORMALMODE,9);
HT1621_CS=1;
}
void HT1621_all_off(void)
{
u8 i;
u8 addr=0;
for(i=0;i<60;i++)
{
Ht1621WrOneData(addr,0x00);
addr+=1;
}
}
void HT1621_number(unsigned char addr,unsigned char num)
{
Ht1621WrOneData(addr,zixingma[num]&0x0f);
Ht1621WrOneData(addr+1,(zixingma[num]>>4)&0x0f);
}
void HT1622_numdis(void)
{
char i,j;
for(i=0;i<32;i+=2)
{
if(i==0 || i==8 || i==32)
j+=2;
HT1621_number(j,disnum[i/2]);
j+=2;
}
}
//初始化PA8和PD2为输出口.并使能这两个口的时钟
//LED IO初始化
void OUT4_Init(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRH&=0XFFF000FF;
GPIOC->CRH|=0X00033300;//PC.10,11,12推挽输出
GPIOC->ODR|=1<<10; //PC.14输出高
GPIOC->ODR|=1<<11; //PC.15输出高
GPIOC->ODR|=1<<12; //PC.15输出高
// GPIOC->ODR&=~(1<<10); //PC.14输出低
// GPIOC->ODR&=~(1<<11); //PC.15输出低
// GPIOC->ODR&=~(1<<12); //PC.16输出低
}[/mw_shl_code]
谢谢了!!!
|