单片机小white 求。路。大
1621驱动LCD段码屏。现在屏幕是亮着 但是屏幕图案会慢慢熄灭。要怎么让屏幕不断刷新频率让它亮着啊
int main(void)
{
HK1621_IO_Init(); //HT1621数据控制IO口初始化
Init_1621(); //HT1621初始化
HK1621_all_off(23);
delay_ms(100);
HK1621_all_on(30);
while(1)
{
}
#include "ht1621b.h"
#include "sys.h"
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;
SysTick->CTRL=0X01;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;
SysTick->CTRL=0X01;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void Ht1621_delay_10us(uint n) // - - 10????????
{
uint i,j;
for(i=n;i>0;i--)
for(j=2;j>0;j--);
}
void Ht1621_delayms(uint xms) // - - 1??????
{
uint i,j;
for(i = xms;i > 0;i --)
for(j = 110;j > 0;j --);
}
void Init_1621(void)
{
SendCmd_1621(HK_SYS_EN); //打开系统时钟
SendCmd_1621(HK_LCD_ON); //turn on
SendCmd_1621(HK_BSIS); // 1/3B,1/4D
SendCmd_1621(HK_TIME_DIS);//禁止时序基准输出
SendCmd_1621(HK_IRQ_DIS); //禁止IRQ输出
}
void HK1621_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
// Name: SendCmd(送命令)
//---------------------------------------------------------------------------*/
void SendCmd_1621(uchar command)
{
uchar i,temp,j;
temp=command;
CS1;// 拉高CS
CS0; // 拉低CS
delay_us(1);
WR1; // 拉高WR;
for(i=0;i<3;i++);
DATA1; // 拉高DATA;
for(i=0;i<3;i++);
WR0;
for(i=0;i<3;i++); //write '1';
WR1;
for(i=0;i<3;i++);
DATA0;// 拉低DATA;
for(i=0;i<3;i++);
WR0; //write '0';
for(i=0;i<3;i++);
WR1;
for(i=0;i<3;i++);
DATA0;
for(i=0;i<3;i++);
WR0; //write '0';
for(i=0;i<3;i++);
WR1;
for(i=0;i<3;i++);
for(i=0;i<8;i++)
{
if(temp&0x80)
DATA1;
else
DATA0;
for(j=0;j<3;j++);
WR0; //write '0';
for(j=0;j<3;j++);
WR1; //write '1';
for(j=0;j<3;j++);
temp=temp<<1;
}
DATA0;//DATA '0'
for(j=0;j<3;j++);
WR0;
for(j=0;j<3;j++);
WR1;
for(j=0;j<3;j++);
CS1;
}
///**-------------------------------------------------------------------------
// Name: Write_1621(送数据和命令程序)
//---------------------------------------------------------------------------*/
void HK1621_WriteData4Bit(uint8_t addr, uint8_t data)
{
uint8_t i;
CS0; // CS = 0
delay_us(1);
// 写入数据标志,DATA:101
WR0; // WR = 0
delay_us(1);
DATA1; // DATA = 1
delay_us(1);
WR1; // WR = 1
delay_us(1);
WR0; // WR = 0
delay_us(1);
DATA0; // DATA = 0
delay_us(1);
WR1; // WR = 1
delay_us(1);
WR0; // WR = 0
delay_us(1);
DATA1; // DATA = 1
delay_us(1);
WR1; // WR = 1
delay_us(1);
// 写入地址,Datasheet中A5~A0
for(i = 0; i < 6; i++)
{
WR0; // WR = 0
delay_us(1);
if((addr << i) & 0x80)
{
DATA1; // DATA = 1
}
else
{
DATA0; // DATA = 0
}
delay_us(1);
WR1; // WR = 1
delay_us(1);
}
// 写入数据,Datasheet中D0~D3
for(i = 0; i < 4; i++)
{
WR0; // WR = 0
delay_us(1);
if((data >> (3 - i)) & 0x01)
{
DATA1; // DATA = 1
}
else
{
DATA0; // DATA = 0
}
delay_us(1);
WR1; // WR = 1
delay_us(1);
}
CS1; // CS = 1
delay_us(1);
}
// Name: all_off(清除1621显示)
//---------------------------------------------------------------------------*/
void HK1621_all_off(uint num)
{
uint i;
uint addr=0;
for(i=0;i<num;i++)
{
HK1621_WriteData4Bit(addr,0x00);
addr+=2;
}
}
///****************************************************************************
// Name: all_on_num(全部点亮1621,显示同样的数字)
//****************************************************************************/
////void HK1621_all_on_num(uint num,uint xx)
////{
//// uint i;
//// uint addr=0;
//// for(i=0;i<num;i++)
//// {
//// HK1621_WriteData4Bit(addr,xx);
//// addr+=2;
//// }
////}
///****************************************************************************
// Name: all_on(全部点亮1621)
//****************************************************************************/
void HK1621_all_on(uint num)
{
uint i;
uint addr=0;
for(i=0;i<num;i++)
{
HK1621_WriteData4Bit(addr,0xff);
addr+=2;
}
}
//显示数组数据
//void displaydata(long int t,int p,char bat1,char bat2,char bat3)//屏显示,bat1,bat2,bat3 右侧电池
//{
// uint i;
// uint8_t dispnum[6];
//
// dispnum[5]=num[t/100000];
// dispnum[4]=num[(t/10000)%10];
// dispnum[3]=num[(t/1000)%10];
// dispnum[2]=num[(t/100)%10];
// dispnum[1]=num[(t/10)%10];
// dispnum[0]=num[t%10];
//
// for(i=0;i<6;i++)
// {
// HK1621_WriteData4Bit(i*2,dispnum[i]);
// }
//}
首先,先初始化所有的资源。用CUBEMX就是这么自信。不会出错。定时器和串口都要中断使能。