![](/img/trans.png)
[英]How to convert unsigned char* to unsigned long long int?
[英]How to Convert unsigned long int to char to show on LCD in C
我有一個應該轉換為字符以在 LCD 上顯示的變量,我的問題是當我使用sprintf
將此整數轉換為字符時,它顯示錯誤的數字,每個長度超過 4 的數字都顯示不正確它僅正確顯示長度為 4 以下的數字。
我的微控制器是ATmega16a IDE 是CodeVisionAVR語言是C
unsigned long int username;
char show[20];
unsigned long int ScanKey(void)
{
unsigned long int num = 0;
_lcd_write_data(0x0F);
PORTC .2 = 1;
while (1)
{
PORTD .0 = 0;
PORTD .1 = 1;
PORTD .2 = 1;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0;
lcd_putchar('1');
num = (num * 10) + 1;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('4');
num = (num * 10) + 4;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0);
lcd_putchar('7');
num = (num * 10) + 7;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
_lcd_write_data(0x10);
lcd_putchar(' ');
_lcd_write_data(0x10);
num /= 10;
}
PORTD .0 = 1;
PORTD .1 = 0;
PORTD .2 = 1;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0);
lcd_putchar('2');
num = (num * 10) + 2;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('5');
num = (num * 10) + 5;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0)
;
lcd_putchar('8');
num = (num * 10) + 8;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
lcd_putchar('0');
num = (num * 10) + 0;
}
PORTD .0 = 1;
PORTD .1 = 1;
PORTD .2 = 0;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0);
lcd_putchar('3');
num = (num * 10) + 3;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('6');
num = (num * 10) + 6;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0);
lcd_putchar('9');
num = (num * 10) + 9;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
break;
}
}
PORTC .2 = 0;
_lcd_write_data(0x0C);
return num;
}
lcd_clear();
lcd_putsf("Enter Username:");
lcd_gotoxy(0, 1);
sprintf(show, "%lu", username);
lcd_puts(show);
這不是我的全部代碼,而是我有問題的部分。
我輸入這個 56321
輸出是這樣的
https://files.fm/f/qpwrmfs6h這是視頻。
我試過%ul
和%lu
, %ul
有同樣的問題, %lu
輸出是這樣的
我的英語不是很好,我很難添加細節
printf
和scanf
函數。 它們是資源貪婪的,不太適合這種微型。printf
和scanf
實現是有限的,不支持許多格式。#define MASK32ULONG 1000000000UL
#define MASK16UINT 10000
char *toDecimal(char *buff, unsigned long val)
{
unsigned long mask = MASK32ULONG;
unsigned long remain;
char *wrk = buff;
do
{
int digit = val / mask;
if(digit || !val) *wrk++ = '0' + digit;
val %= mask;
mask /= 10;
}while(val);
*wrk = 0;
return buff;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.